--[[我自定义的CE用lua模块.

  myCEModule.findRegion:寻找符合条件的内存区域(Memory Region)的首地址,
    找不到返回0
  
  myCEModule.findModule:寻找指定名称(区分大小写)的模块首地址,找不到返回0
  
  myCEModule.addMemRecords:添加一组监视的内存地址
  
  作者:setycyas 
  最后修改:2020/5/16
--]]

-- 导出变量
myCEModule = {}

-- 寻找特定区域首地址,指定该区域的大小,开始地址可能的最小值,最大值,
-- 找不到返回0
function myCEModule.findRegion(regionSize, addrMin, addrMax)
  local em = enumMemoryRegions();  --关键,返回内存区枚举
  for i,v in ipairs(em) do
    if((v['BaseAddress'] >= addrMin) and (v['BaseAddress'] <= addrMax))
    then
      if(v['RegionSize'] == regionSize)
      then
        return v['BaseAddress'];
      end
    end
  end
  return 0;
end

-- 寻找指定名称(区分大小写)的模块首地址,找不到返回0
function myCEModule.findModule(moduleName)
  local modules = enumModules();
  for i, v in ipairs(modules) do
    if (v['Name'] == moduleName) 
    then
      return v['Address'];
    end
  end
  return 0;
end

-- 指定基址与监视内存地址表,添加监视的数据.监视的内存地址表为一个数组,
-- 该数组的每一项为{监视的地址相对基址的偏移量,变量名称,数据类型},如:
-- {0x91B,'钱',vtWord}
function myCEModule.addMemRecords(baseAddr,array)
  local addressList = getAddressList();--获取修改器地址列表对象,该对象执行createMemoryRecord()即可添加地址记录,
  local memRecord = nil; --用于保存新建的MemoryRecord对象
  local curAddress = 0; --用于保存要加入的地址列表的新地址
  for i,v in ipairs(array) do
    curAddress = baseAddr+v[1];
    memRecord = addressList.createMemoryRecord(); --返回一个MemoryRecord对象,对该对象执行不同的设置可修改该条地址记录.
    memRecord.setDescription(v[2]);
    memRecord.Address = string.format("%#x",curAddress); --字符串格式化为16进制
    memRecord.Type = v[3];
  end
end